﻿using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;
using Onshi.POS.Formularios.Recursos;
using Onshi.POS.Modelo.Entidades;
using Onshi.POS.Modelo.Enumeradores;
using Onshi.POS.Modelo.Objetos;
using Onshi.POS.Clientes;
using Onshi.POS.Clientes.Vistas;

namespace Onshi.POS.Formularios.Cliente
{
    public partial class ClientesAltaModificacion : FormularioBase, IClientesAltaModificacion
    {
        #region Constructores

        public ClientesAltaModificacion()
        {
            InitializeComponent();
            presentador = new ClientesAltaModificacionPresentador(this);
            Text = "Alta de cliente";
            estadoAbm = EnumEstadoAltaBajaModificacionHabilitacion.ALTA;
        }

        public ClientesAltaModificacion(Int32 idVendedor)
            : this()
        {
            Text = "Modificación de cliente";
            this.idCliente = idVendedor;
            estadoAbm = EnumEstadoAltaBajaModificacionHabilitacion.MODIFICACION;
        }

        #endregion

        #region Atributos

        private Int32 idCliente;
        private EnumEstadoAltaBajaModificacionHabilitacion estadoAbm;
        private ClientesAltaModificacionPresentador presentador;

        #endregion

        #region Propiedades

        public List<ClienteTipoFormaPago> ListaTiposFormasPagos
        {
            get
            {
                var lista = new List<ClienteTipoFormaPago>();
                for (var i = 0; i < chkLstTiposFormasPagos.Items.Count; i++)
                {
                    var item = (ClienteTipoFormaPago)chkLstTiposFormasPagos.Items[i];
                    item.TienePermiso = false;
                    for (var j = 0; j < chkLstTiposFormasPagos.CheckedIndices.Count; j++)
                        if (item == chkLstTiposFormasPagos.CheckedItems[j])
                            item.TienePermiso = true;
                    lista.Add(item);
                }
                return lista;
            }
            set
            {
                chkLstTiposFormasPagos.Items.Clear();
                foreach (var item in value)
                    if (item.TienePermiso)
                        chkLstTiposFormasPagos.Items.Add(item, CheckState.Checked);
                    else
                        chkLstTiposFormasPagos.Items.Add(item, CheckState.Unchecked);
            }
        }

        public Int32 IdCliente
        {
            get { return idCliente; }
            set { idCliente = value; }
        }

        public Int32 IdRubroCliente
        {
            get { return (Int32)ucRubroCliente.cboRubrosClientes.SelectedValue; }
            set { ucRubroCliente.cboRubrosClientes.SelectedValue = value; }
        }

        public Byte IdTipoMensajeriaInstantanea
        {
            get { return (Byte)cboTipoMensajeriaInstantanea.SelectedValue; }
            set { cboTipoMensajeriaInstantanea.SelectedValue = value; }
        }

        public String Codigo
        {
            get { return txtCodigo.Text; }
            set { txtCodigo.Text = value; }
        }

        public String Nombre
        {
            get { return txtNombre.Text; }
            set { txtNombre.Text = value; }
        }

        public String Cuit
        {
            get { return mskCuit.Text; }
            set { mskCuit.Text = value; }
        }

        public Decimal LimiteDeuda
        {
            get { return numDescuentoRecargo.Value; }
            set { numDescuentoRecargo.Value = value; }
        }

        public Decimal DescuentoRecargo
        {
            get { return numLimiteDeuda.Value; }
            set { numLimiteDeuda.Value = value; }
        }

        public String Email
        {
            get { return txtEmail.Text; }
            set { txtEmail.Text = value; }
        }

        public String SitioWeb
        {
            get { return txtSitioWeb.Text; }
            set { txtSitioWeb.Text = value; }
        }

        public String MensajeriaInstantanea
        {
            get { return txtMensajeriaInstantanea.Text; }
            set { txtSitioWeb.Text = value; }
        }

        public Image Imagen
        {
            get { return picImagen.Image; }
            set { picImagen.Image = value; }
        }

        public String Observacion
        {
            get { return txtObservacion.Text; }
            set { txtObservacion.Text = value; }
        }

        public List<DomicilioCliente> ListaDomicilios
        {
            get { return (List<DomicilioCliente>)bsDomicilios.DataSource; }
            set { bsDomicilios.DataSource = value; }
        }

        public List<TelefonoCliente> ListaTelefonos
        {
            get { return (List<TelefonoCliente>)bsTelefonos.DataSource; }
            set { bsTelefonos.DataSource = value; }
        }

        public EnumEstadoAltaBajaModificacionHabilitacion EstadoABM
        {
            get { return estadoAbm; }
        }

        public Byte IdTipoIva
        {
            get { return (Byte)cboTipoIva.SelectedValue; }
            set { cboTipoIva.SelectedValue = value; }
        }

        public Int32 IdListaPrecioVenta
        {
            get { return (Int32)ucListaPrecioVenta.cboListasPreciosVentas.SelectedValue; }
            set { ucListaPrecioVenta.cboListasPreciosVentas.SelectedValue = value; }
        }

        public Int32 IdVendedor
        {
            get { return ucVendedor.IdVendedorSeleccionado; }
            set { ucVendedor.IdVendedorSeleccionado = value; }
        }

        #endregion

        #region Eventos

        private void btnVerObservacionDomicilio_Click(Object sender, EventArgs e)
        {
            if (bsDomicilios.Current != null)
            {
                var domicilio = ((Domicilio)bsDomicilios.Current);
                if (domicilio.TieneObservacion)
                {
                    var observacionVer = new ObservacionVer(EnumTipoEntidad.DOMICILIO_VENDEDOR, domicilio.ToString(), domicilio.Observacion);
                    observacionVer.ShowDialog();
                }
            }
        }

        private void btnVerObservacionTelefono_Click(Object sender, EventArgs e)
        {
            if (bsDomicilios.Current != null)
            {
                var telefono = ((Telefono)bsTelefonos.Current);
                if (telefono.TieneObservacion)
                {
                    var observacionVer = new ObservacionVer(EnumTipoEntidad.TELEFONO_VENDEDOR, telefono.ToString(), telefono.Observacion);
                    observacionVer.ShowDialog();
                }
            }
        }

        private void btnAceptar_Click(Object sender, EventArgs e)
        {
            try
            {
                var ok = true;
                errClientes.Clear();
                if (mskCuit.Text != String.Empty && !Validaciones.ValidarCuitCuil(Convert.ToInt64(mskCuit.Text)))
                {
                    ok = false;
                    errClientes.SetError(mskCuit, "El C.U.I.T ingresado no es valido");
                }
                if (txtCodigo.Text.Trim() == String.Empty)
                {
                    ok = false;
                    errClientes.SetError(txtCodigo, DatosComunes.CompletarCampo);
                }
                if (txtNombre.Text.Trim() == String.Empty)
                {
                    ok = false;
                    errClientes.SetError(txtNombre, DatosComunes.CompletarCampo);
                }
                if (ucRubroCliente.cboRubrosClientes.SelectedIndex == -1)
                {
                    ok = false;
                    errClientes.SetError(ucRubroCliente, DatosComunes.CompletarCampo);
                }
                if (cboTipoIva.SelectedIndex == -1)
                {
                    ok = false;
                    errClientes.SetError(cboTipoIva, DatosComunes.CompletarCampo);
                }
                if (cboTipoMensajeriaInstantanea.SelectedIndex == -1)
                {
                    ok = false;
                    errClientes.SetError(cboTipoMensajeriaInstantanea, DatosComunes.CompletarCampo);
                }
                if (ok)
                {
                    presentador.Aceptar();
                    DialogResult = DialogResult.OK;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void btnCancelar_Click(Object sender, EventArgs e)
        {
            Close();
        }

        private void btnDomiciliosNuevo_Click(Object sender, EventArgs e)
        {
            var domiciliosAltaModificacion = new DomiciliosAltaModificacion(EnumTipoEntidad.DOMICILIO_CLIENTE);
            domiciliosAltaModificacion.MinimizeBox = false;
            domiciliosAltaModificacion.MaximizeBox = false;
            if (domiciliosAltaModificacion.ShowDialog() == DialogResult.OK)
                bsDomicilios.Add(domiciliosAltaModificacion.DomicilioSeleccionado);
        }

        private void btnDomiciliosModificar_Click(Object sender, EventArgs e)
        {
            if (bsDomicilios.Current != null)
            {
                var domiciliosAltaModificacion = new DomiciliosAltaModificacion(EnumTipoEntidad.DOMICILIO_CLIENTE, (Domicilio)bsDomicilios.Current);
                domiciliosAltaModificacion.MinimizeBox = false;
                domiciliosAltaModificacion.MaximizeBox = false;
                if (domiciliosAltaModificacion.ShowDialog() == DialogResult.OK)
                {
                    bsDomicilios.List[bsDomicilios.Position] = domiciliosAltaModificacion.DomicilioSeleccionado;
                    grdDomicilios.Refresh();
                }
            }
        }

        private void btnDomiciliosEliminar_Click(Object sender, EventArgs e)
        {
            if (bsDomicilios.Current != null)
                if (MessageBox.Show("¿Esta seguro que desea eliminar el domicilio seleccionado?", Properties.Settings.Default.NombreAplicacion, MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    bsDomicilios.RemoveCurrent();
        }

        private void btnTelefonosNuevo_Click(Object sender, EventArgs e)
        {
            var telefonosAltaModificacion = new TelefonosAltaModificacion(EnumTipoEntidad.TELEFONO_VENDEDOR);
            telefonosAltaModificacion.MinimizeBox = false;
            telefonosAltaModificacion.MaximizeBox = false;
            if (telefonosAltaModificacion.ShowDialog() == DialogResult.OK)
                bsTelefonos.Add(telefonosAltaModificacion.TelefonoSeleccionado);
        }

        private void btnTelefonosModificar_Click(Object sender, EventArgs e)
        {
            if (bsTelefonos.Current != null)
            {
                var telefonosAltaModificacion = new TelefonosAltaModificacion(EnumTipoEntidad.TELEFONO_VENDEDOR, (Telefono)bsTelefonos.Current);
                telefonosAltaModificacion.MinimizeBox = false;
                telefonosAltaModificacion.MaximizeBox = false;
                if (telefonosAltaModificacion.ShowDialog() == DialogResult.OK)
                {
                    bsTelefonos.List[bsTelefonos.Position] = telefonosAltaModificacion.TelefonoSeleccionado;
                    grdTelefonos.Refresh();
                }
            }
        }

        private void btnTelefonosEliminar_Click(Object sender, EventArgs e)
        {
            if (bsTelefonos.Current != null)
                if (MessageBox.Show("¿Esta seguro que desea eliminar el telefono seleccionado?", Properties.Settings.Default.NombreAplicacion, MessageBoxButtons.YesNo, MessageBoxIcon.Information, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                    bsTelefonos.RemoveCurrent();
        }

        private void ClientesAltaModificacion_Load(Object sender, EventArgs e)
        {
            try
            {
                cboTipoIva.ActualizarListado();
                cboTipoIva.SelectedValue = (Byte)EnumTipoIva.CONSUMIDOR_FINAL;
                cboTipoMensajeriaInstantanea.ActualizarListado();
                cboTipoMensajeriaInstantanea.SelectedValue = (Byte)EnumTipoMensajeriaInstantanea.NO_UTILIZA;
                ucRubroCliente.ActualizarListado();
                ucRubroCliente.cboRubrosClientes.SelectedValue = (Int32)EnumRubroCliente.RUBRO_UNICO;
                ucListaPrecioVenta.ActualizarListado();
                ucListaPrecioVenta.cboListasPreciosVentas.SelectedValue = (Int32)EnumListaPrecioVenta.GENERAL;
                ucVendedor.IdVendedorSeleccionado = (Int32)EnumVendedor.TITULAR_DEL_COMERCIO;
                presentador.Inicializar();
                if (chkLstTiposFormasPagos.Items.Count > 0)
                {
                    var indiceEfectivo = 0;
                    for (Int32 i = 0; i < chkLstTiposFormasPagos.Items.Count; i++)
                        if (((ClienteTipoFormaPago)chkLstTiposFormasPagos.Items[i]).TipoFormaPago.Id == (Byte)EnumTipoFormaPago.EFECTIVO)
                        {
                            indiceEfectivo = i;
                            break;
                        }
                    chkLstTiposFormasPagos.SetItemChecked(indiceEfectivo, true);
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, DatosComunes.NombreAplicacion, MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
        }

        private void cboTipoMensajeriaInstantanea_SelectedValueChanged(Object sender, EventArgs e)
        {
            if (cboTipoMensajeriaInstantanea.SelectedValue != null)
                if ((Byte)cboTipoMensajeriaInstantanea.SelectedValue == (Byte)EnumTipoMensajeriaInstantanea.NO_UTILIZA)
                    txtMensajeriaInstantanea.Enabled = false;
                else
                    txtMensajeriaInstantanea.Enabled = true;
        }

        private void btnImagenAgregar_Click(Object sender, EventArgs e)
        {
            if (dlgImagen.ShowDialog() == DialogResult.OK && dlgImagen.FileName != String.Empty)
                picImagen.Load(dlgImagen.FileName);
        }

        private void btnImagenQuitar_Click(Object sender, EventArgs e)
        {
            if (picImagen.Image != null && MessageBox.Show("¿Está seguro que desea quitar la imagen actual?", Properties.Settings.Default.NombreAplicacion, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) == DialogResult.Yes)
                picImagen.Image = null;
        }

        private void grdDomicilios_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == colDomicilioObservacion.Index)
                if (((DomicilioCliente)bsDomicilios.List[e.RowIndex]).TieneObservacion)
                    e.Value = Properties.Resources.page_copy;
        }

        private void grdTelefonos_CellFormatting(Object sender, DataGridViewCellFormattingEventArgs e)
        {
            if (e.ColumnIndex == colTelefonoObservacion.Index)
                if (((TelefonoCliente)bsTelefonos.List[e.RowIndex]).TieneObservacion)
                    e.Value = Properties.Resources.page_copy;
        }

        private void grdDomicilios_CellContentClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (e.ColumnIndex == colDomicilioObservacion.Index)
                {
                    var domicilio = ((DomicilioCliente)bsDomicilios.List[e.RowIndex]);
                    var observacionVer = new ObservacionVer(EnumTipoEntidad.DOMICILIO_CLIENTE, domicilio.ToString(), domicilio.Observacion);
                    observacionVer.ShowDialog();
                }
        }

        private void grdTelefonos_CellContentClick(Object sender, DataGridViewCellEventArgs e)
        {
            if (e.RowIndex != -1)
                if (e.ColumnIndex == colTelefonoObservacion.Index)
                {
                    var telefono = ((TelefonoCliente)bsTelefonos.List[e.RowIndex]);
                    var observacionVer = new ObservacionVer(EnumTipoEntidad.TELEFONO_CLIENTE, telefono.ToString(), telefono.Observacion);
                    observacionVer.ShowDialog();
                }
        }

        #endregion
    }
}